package com.ftg.learn.chapter10;

import java.time.chrono.MinguoDate;
import java.util.Arrays;
import java.util.Scanner;

public class demo2 {
//    public static void main(String[] args) {
//        Scanner scan = new Scanner(System.in);
//        int[] arr = new int[5];
//        for(int i = 0;i< arr.length;i++){
//            System.out.println("请输入数组下标"+i+"值");
//            int num = scan.nextInt();
//            arr[i] = num;
//        }
//        System.out.println(Arrays.toString(arr));//快速输出数组的内容
//    }
    //全局数组as
    int[] as = new int[5];
    //index代表demo2类的as数组里实际真实赋过值的元素个数下标（不算未赋值的）
    int index = 0;
    //定义扩容判断的阈值
    double flag = 0.75;//已经赋值的元素超过百分之75时，开始扩容。
    public void add(int num){
        //阈值取整
        int yu = (int)(as.length*flag);
        //判断已经赋过值的数组元素个数是否到达阈值，如果未到达，则直接赋值
        if(index == yu){
            //扩容1.5
            int[] newAs = new int[as.length+(as.length >> 1)];
            //迁移
            for(int i = 0,len = as.length;i<len;i++){
                newAs[i] = as[i];
            }
            //新数组指向原数组地址
            as = null;
            as = newAs;
        }
        //把传入的数赋值给as,并且增加一位实际元素的个数
        as[index++] = num;
        System.out.println(Arrays.toString(as));
    }

    /**
     * 按下标删除
     * @param ix 下标
     */
    public void del(int ix){
        //判断下标是否超过原数组的赋过值的个数
        if(ix <= index){
            //把要删除的元素下标定为循环初值，终值为整个as数组的length-1
            for(int i = ix;i <as.length-1;i++){
                as[i] = as[i+1];//后续元素覆盖已经删除的元素。
            }
        }
        index--;//as里赋过值的个数减一
        System.out.println(Arrays.toString(as));
    }

    /**
     * 删除指定的begin--end的下标
     * @param begin  开始下标
     * @param end   结束下标
     */
    public void del(int begin,int end){
        //判断开始数大于0并且开始下标小于结束下标，并且结束下标大于as数组里已经赋值过的个数
        if(begin > 0 && begin <end && end < index){
            //定义要删除多少个元素
            int between = end - begin;
            //
            for(int i = end;i<index;i++){
                //
                as[begin++] = as[i];
            }
            //删除元素的个数
            index -= between;
        }
    }

    /**
     * 返回数据当中有效数据的个数
     * @return
     */
    public int length(){
        return index;
    }

    public void update(int index,int obj){
        if(index > 0 && index < length()){
            as[index] = obj;
        }
    }

    public int[] show(){
        int[] newAs = new int[length()];
        for(int i = 0,len = newAs.length;i < len;i++){
            newAs[i] = as[i];
        }
        return newAs;
    }

    //crud : create read update delete

}
